package view.chart;
import java.awt.Color;
import java.sql.SQLException;
import java.sql.Time;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

import misc.Util;
import model.dao.AplicativoDAO;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

public class AplicativoChart{
	private AplicativoChart(){
//		CategoryDataset dataset = createDataset();
//		JFreeChart chart = createChart(dataset);
//		ChartPanel chartPanel = new ChartPanel(chart);
//		chartPanel.setPreferredSize(new Dimension(800, 600));
	}
	
	private static CategoryDataset createQuantidadeAcessoDataset(String aplicacaoNome, String startPeriod, String endPeriod){
		try{
			DefaultCategoryDataset dataset = new DefaultCategoryDataset();
			if(aplicacaoNome != null){
				int quantidadeAcesso = AplicativoDAO.queryQuatidadeAcesso(aplicacaoNome, startPeriod, endPeriod);				
				if(quantidadeAcesso > 0){
					dataset.addValue(quantidadeAcesso, "Quantidade de acessos na aplicação", aplicacaoNome);
				}
			}
			
			return dataset;
		}catch(NullPointerException e){
			e.printStackTrace();
		}catch(SQLException e){
			e.printStackTrace();
		}		
		return null;
	}
	
	private static JFreeChart createQuantidadeAcessoChart(CategoryDataset dataset) {
		JFreeChart chart = ChartFactory.createBarChart3D(
				"Quantidade de acessos na aplicação", // Titulo do grafico
				"Aplicação", // Titulo do eixo x
				"Quantidade de acessos", // Titulo do eixo y
				dataset, // dados
				PlotOrientation.VERTICAL, // orientacao
				true, // incluir legenda
				true, // incluir hint
				false // incluir URLs
				);
		chart.setBackgroundPaint(Color.white);
		CategoryPlot categoryPlot = chart.getCategoryPlot();
		categoryPlot.setBackgroundPaint(Color.lightGray);
		categoryPlot.setDomainGridlinePaint(Color.white);
		categoryPlot.setRangeGridlinePaint(Color.white);
		NumberAxis rangeAxis = (NumberAxis) categoryPlot.getRangeAxis();
		rangeAxis.setUpperMargin(0.15);
		BarRenderer barRenderer = (BarRenderer)categoryPlot.getRenderer();
		barRenderer.setSeriesPaint(0, new Color(0, 0, 120));
		categoryPlot.setForegroundAlpha(0.80f);
		
		return chart;
	}

	public static JPanel createQuantidadeAcessoPanel(String aplicacaoNome, String startPeriod, String endPeriod){
		JFreeChart chart = createQuantidadeAcessoChart(createQuantidadeAcessoDataset(aplicacaoNome, startPeriod, endPeriod));
		return new ChartPanel(chart);
	}
	
	private static CategoryDataset createTempoMedioDataset(String aplicacaoNome, String startPeriod, String endPeriod){
		try{
			DefaultCategoryDataset dataset = new DefaultCategoryDataset();
			if(aplicacaoNome != null){
				Time tempoMedio = AplicativoDAO.queryTempoMedio(aplicacaoNome, startPeriod, endPeriod);				
				if(tempoMedio != null){
					dataset.addValue(Util.timeToSeconds(tempoMedio), "Tempo médio na aplicação", aplicacaoNome + " - " +tempoMedio.toString());
				}
			}
			
			return dataset;
		}catch(NullPointerException e){
			e.printStackTrace();
		}catch(SQLException e){
			e.printStackTrace();
		}		
		return null;
	}
	
	private static JFreeChart createTempoMedioChart(CategoryDataset dataset, String aplicacaoNome){
		JFreeChart chart = ChartFactory.createBarChart3D(
				"Tempo médio na aplicação", // Titulo do grafico
				"Aplicação", // Titulo do eixo x
				"Quantidade de tempo em segundos", // Titulo do eixo y
				dataset, // dados
				PlotOrientation.VERTICAL, // orientacao
				true, // incluir legenda
				true, // incluir hint
				false // incluir URLs
				);
		chart.setBackgroundPaint(Color.WHITE);
		CategoryPlot categoryPlot = chart.getCategoryPlot();
		categoryPlot.setBackgroundPaint(Color.LIGHT_GRAY);
		categoryPlot.setDomainGridlinePaint(Color.WHITE);
		categoryPlot.setRangeGridlinePaint(Color.WHITE);
		NumberAxis rangeAxis = (NumberAxis) categoryPlot.getRangeAxis();
		rangeAxis.setUpperMargin(0.15);
		BarRenderer barRenderer = (BarRenderer)categoryPlot.getRenderer();
		barRenderer.setSeriesPaint(0, new Color(0, 0, 120));
		categoryPlot.setForegroundAlpha(0.80f);
		
		return chart;
	}

	public static JPanel createTempoMedioPanel(String aplicacaoNome, String startPeriod, String endPeriod){
		JFreeChart chart = createTempoMedioChart(createTempoMedioDataset(aplicacaoNome, startPeriod, endPeriod), aplicacaoNome);
		return new ChartPanel(chart);
	}
	
	private static CategoryDataset createTotalDataset(String startPeriod, String endPeriod){
		try{
			DefaultCategoryDataset dataset = new DefaultCategoryDataset();
			List<String> aplicacoes = AplicativoDAO.queryDistinctNomes();
			for(int i=0; i<aplicacoes.size(); i++){
				dataset.addValue(Util.timeToSeconds(AplicativoDAO.queryTempoMedio(aplicacoes.get(i), startPeriod, endPeriod)), "Tempo médio na aplicação", aplicacoes.get(i) + " (" + AplicativoDAO.queryQuatidadeAcesso(aplicacoes.get(i), startPeriod, endPeriod) + ") - " + AplicativoDAO.queryTempoMedio(aplicacoes.get(i), startPeriod, endPeriod).toString());
			}
			
			return dataset;
		}catch(NullPointerException e){
			e.printStackTrace();
		}catch(SQLException e){
			e.printStackTrace();
		}		
		return null;
	}
	
	private static JFreeChart createTotalChart(CategoryDataset dataset){
		JFreeChart chart = ChartFactory.createBarChart3D(
				"Tempo médio por aplicação", // Titulo do grafico
				"Aplicações", // Titulo do eixo x
				"Quantidade de tempo em segundos", // Titulo do eixo y
				dataset, // dados
				PlotOrientation.VERTICAL, // orientacao
				true, // incluir legenda
				true, // incluir hint
				false // incluir URLs
				);
		chart.setBackgroundPaint(Color.WHITE);
		CategoryPlot categoryPlot = chart.getCategoryPlot();
		categoryPlot.setBackgroundPaint(Color.LIGHT_GRAY);
		categoryPlot.setDomainGridlinePaint(Color.WHITE);
		categoryPlot.setRangeGridlinePaint(Color.WHITE);
		NumberAxis rangeAxis = (NumberAxis) categoryPlot.getRangeAxis();
		rangeAxis.setUpperMargin(0.15);
		BarRenderer barRenderer = (BarRenderer)categoryPlot.getRenderer();
		barRenderer.setSeriesPaint(0, new Color(0, 0, 120));
		categoryPlot.setForegroundAlpha(0.80f);
		
		return chart;
	}

	public static JPanel createTotalPanel(String startPeriod, String endPeriod){
		JFreeChart chart = createTotalChart(createTotalDataset(startPeriod, endPeriod));
		return new ChartPanel(chart);
	}
	
	public static void main(String[] args) {
		try{
			JFrame demo = new JFrame();
			demo.setContentPane(AplicativoChart.createTempoMedioPanel("Tvilo Viewer", "2012-8-7", "2012-11-1"));
			//demo.setContentPane(AplicacaoChart.createQuantidadeAcessoPanel("Tvilo Viewer", "2012-8-7", "2012-11-1"));
			//demo.setContentPane(AplicacaoChart.createTotalPanel("2012-8-7", "2012-11-1"));
			demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			demo.pack();
			demo.setVisible(true);
		}catch(NullPointerException e){
			e.printStackTrace();}
//		}catch(SQLException e){
//			e.printStackTrace();
//		}
	}
}